package LimitedTimeGame.Day_0211;

/**
 * @author zxc
 * @date 2023/02/11 10:40
 **/

import java.util.Arrays;

/**
 * 题目 ：装满杯子所需要的最短时长
 * 题目详述 ：
 * 现有一台饮水机，可以制备冷水、温水和热水。每秒钟，可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。
 * 给你一个下标从 0 开始、长度为 3 的整数数组 amount ，其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。
 * 返回装满所有杯子所需的 最少 秒数。
 *
 *提示：
 * amount.length == 3
 * 0 <= amount[i] <= 100
 *
 */
public class FillCups03 {
    /**
     * 思路 ：
     * 即，贪心 + 分类讨论
     *
     * ===》
     * 假设所要接三种水的杯数，从低到高进行排序，设为x,y,z（x <= y <= z）
     * 1.x+y <= z
     * ===> 最少秒数 ：z;
     * 2.x+y > z
     * ===>
     * t = x + y - z,即将多余的杯数 平分给x，y;
     * 然后，在使得剩余的x,y杯数和z杯数一起计算秒数
     *（1）t为偶数时，即多余杯数正好可以平分给x，y;
     * ===》 最少秒数 ：t/2 + z = (x + y + z)/2;
     *（2）t为奇数时，即多余杯数不能够正好平分给x，y;（即，必然多出一杯）
     * ===> 最少秒数 ：t/2 + z + 1 = (x + y + z + 1)/2;
     *
     * ===》
     * 总结 ：即，所求得的最少秒数 ：即，尽可能多使用两杯一起接，效率较高;
     *
     * @param amount
     * @return
     */
    public int fillCups(int[] amount) {
        Arrays.sort(amount);
        int min = amount[0];
        int mid = amount[1];
        int max = amount[2];
        if(min + mid <= max){
            return max;
        }
        else {
            // 分情况讨论 : min + mid是偶数还是奇数;
            return (min + mid + max + 1)/2;
        }
    }
}
